class Shape//Shape.h
{
public:
	virtual void showData()=0;//  定义了三个纯虚函数
	virtual double reArea()=0;
	virtual double reVolume()=0;
};

class TwoDimShape: public Shape
{
protected:
//    既然说要有数据成员，肯定是要用这里的数据成员来继承派生类，
//    那想想是二维图形，至少要有两个长度数据（虽说本来就要不少于两个）
    double a;
    double b;
public:
//    这里必须把三个纯虚函数都重写了，原因：
//    会报错cannot declare variable ‘xx to be of abstract type A
//    原因1：A是一个抽象类，里面有纯虚函数，因此不能创建实例
//    原因2：A是一个子类，继承了某个抽象类，没有重写抽象类里的某个纯虚函数，
//    因此仍然不能用于创建实例。
//    显然是原因2会造成报错
    virtual void showData(){};
    virtual double reArea(){return 0;};
    virtual double reVolume(){return 0;};
};

class ThreeDimShape: public Shape
{
protected:
//    于是三维就三个数据成员喽
    double a;
    double b;
    double c;
public:
    virtual void showData(){};
    virtual double reVolume(){return 0;};
    virtual double reArea(){return 0;};
};

class Circle: public TwoDimShape    //  因为是树形结构，并不需要虚基类
{
public:
    Circle(double);
    void showData();
    double reArea();
};

class Ellipse: public TwoDimShape //   elipse是法语的椭圆
{
public:
    Ellipse(double,double);
    void showData();
    double reArea();
};

class Rectangle: public TwoDimShape
{
public:
    Rectangle(double,double);
    void showData();
    double reArea();
};

class Triangle: public TwoDimShape
{
public:
    Triangle(double,double);
    void showData();
    double reArea();
};

class Ball: public ThreeDimShape
{
public:
    Ball(double);
    void showData();
    double reVolume();
};

class Cylinder: public ThreeDimShape
{
public:
    Cylinder(double,double);
    void showData();
    double reVolume();
};

class Cuboid: public ThreeDimShape //  另一个实在太长了，就用Cuboid
{
public:
    Cuboid(double,double,double);
    void showData();
    double reVolume();
};
